home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 361_01 / garble.c < prev    next >
C/C++ Source or Header  |  1991-09-18  |  4KB  |  162 lines

  1.  
  2.  
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. #include <io.h>
  6. #include <stdlib.h>
  7. #include <stdek.h>
  8.  
  9. /* GARBLE ---> A Text Scrambling Utility.   5 October 89
  10.  *
  11.  * Author: J.Ekwall
  12.  *
  13.  * Copyrighted to the Public Domain.  Unlimited Distribution Authorized.
  14.  *
  15.  * User Assumes All Risks/Responcibilities.
  16.  *
  17.  * Last Update: 5 October 89/EK
  18.  */
  19.  
  20. /* Declare ProtoTypes */
  21. void Blip(void);
  22. void Decode(void);
  23. void Encode(void);
  24. int Password(char *);
  25. void Usage(void);
  26.  
  27. /* Declare Globals */
  28. int K1, K2, K3, U_Flag = FALSE;
  29. char Text[345];
  30. FILE *fp = stdin;
  31.  
  32. /* Roman Centurians guarded their field orders by writing them on a ribbon
  33.  * wrapped around their Staff (a symbol of their rank).  Since the message
  34.  * was written along the axis, the unwrapped ribbon was a ramble of letters.
  35.  *
  36.  * Decoding was done by unrolling the ribbon and wrapping it around a Staff
  37.  * of similar diameter.  Quick, simple and effective.
  38.  *
  39.  * GARBLE uses a buffer and a "Jump-Read" size based on a Password, in effect
  40.  * varying the "Diameter" of the Staff.
  41.  */
  42.  
  43. main (int argc, char *argv[])
  44. {
  45.     int c, i;
  46.     char *tp1;
  47.  
  48.  /* Check Passed Parameters */
  49.     if (argc IS 1) Usage();
  50.     while (*argv[1] IS '/') {
  51.        for (tp1 = argv[1] + 1;(c = toupper(*tp1++)) != NULL; ){
  52.           switch (c) {
  53.           case 'U': U_Flag = TRUE; break;
  54.           default: Usage();
  55.           }
  56.        }
  57.        for (i = 1; i < argc; i++) argv[i] = argv[i + 1]; argc--;
  58.     }
  59.  
  60.  /* Verify & Recover Password */
  61.     if ((argc IS 1) || (argc > 3)) Usage();
  62.     if (!Password(argv[1])) Usage();
  63.  
  64.  /* Open Specified File (If Any) */
  65.     if (argc IS 3)
  66.        if ((fp = fopen(argv[2],"r")) IS NULL) {
  67.           perror(argv[2]); exit(1); }
  68.     if ((argc IS 2) && !INFLOW_EXISTS) Usage();
  69.  
  70.  
  71.  /* Do Business */
  72.     if (U_Flag) Decode(); else Encode();
  73. }
  74.  
  75. void Blip(void)
  76. {
  77.     static int i = 0;
  78.  
  79.     putc(DOT,stderr); if (i++ IS 78) { putc(NL,stderr); i = 0; }
  80. }
  81.  
  82. void Decode(void)
  83. {
  84.     int c, i, j;
  85.     char *tp1;
  86.  
  87.     while ((c = getc(fp)) != EOF) {
  88.        ungetc(c,fp); if (OUTFLOW_EXISTS) Blip();
  89.  
  90.     /* Jump-Load Text Buffer */
  91.        for (i = 0, j = K2; i < K3; i++) {
  92.           if ((c = getc(fp)) IS EOF) Usage();
  93.           if (c IS 255) c = NULL; Text[j] = c;
  94.           if ((j += K1) >= K3) j %= K3;
  95.        }
  96.  
  97.     /* Print ReCovered Text */
  98.        Text[K3] = NULL; printf("%s",Text);
  99.     }
  100. }
  101.  
  102. void Encode(void)
  103. {
  104.     int c, i, j;
  105.     char *tp1;
  106.  
  107.  /* PreLoad Text$ w/ Junk */
  108.     for (i = 0, tp1 = Text; i < K3; i++) {
  109.        while ((c = random(127)) < SPACE); *tp1++ = c; }
  110.  
  111.  /* Fill Text$ & Jump-Read into Stdout */
  112.     while ((c = getc(fp)) != EOF) {
  113.        ungetc(c,fp); Blip();
  114.        for (i = 0, tp1 = Text; i < K3; i++) {
  115.           if ((c = getc(fp)) IS EOF) { *tp1 = 255; break; }
  116.           *tp1++ = c;
  117.        }
  118.  
  119.     /* Jump-Read Text Buffer */
  120.        for (i = 0, j = K2; i < K3; i++) {
  121.           putchar(Text[j]);
  122.           if ((j += K1) >= K3) j %= K3;
  123.        }
  124.     }
  125. }
  126.  
  127. int Password(char *Passwd)
  128. {
  129.     int c, i;
  130.     int A_Flag = FALSE, HC_Flag = FALSE, LC_Flag = FALSE, N_Flag = FALSE;
  131.     char *tp1;
  132.  
  133.  /* Capture & Validate Password */
  134.     for (tp1 = Passwd, K1 = K2 = i = 0; (c = *tp1++) != NULL; i++) {
  135.        if (isalnum(c)) A_Flag = TRUE; else N_Flag = TRUE;
  136.        if (isupper(c)) HC_Flag = TRUE;
  137.        if (islower(c)) LC_Flag = TRUE;
  138.        if (i < 3) K1 += c; else K2 += c;
  139.     }
  140.  
  141.  /* Fold Keys */
  142.     K1 %= 16; K1 += 3; K3 = K1 * K1 + K1; K2 %= K3--;
  143.     fprintf(stderr,"\nKey1 = %d, Key2 = %d, Key3 = %d.\n",K1,K2,K3);
  144.  
  145.  
  146.     if ((i > 5) && (i < 17) && A_Flag && N_Flag && HC_Flag && LC_Flag)
  147.        return(TRUE);
  148.  
  149.     fprintf(stderr,"\nGARBLE: Invalid Password.\n");
  150.     fprintf(stderr,"     6-16 CHR$ & Mixed Case w/ Non-Alphanumeric.\n\n");
  151.     return(FALSE);
  152. }
  153.  
  154. void Usage(void)
  155. {
  156.     fprintf(stderr, "\nUsage:\n");
  157.     fprintf(stderr,
  158.      "       GARBLE [/U] Password [File] ---> Scramble Text.\n\n");
  159.     exit(1);
  160. }
  161.  
  162.